package com.controller;

import com.alibaba.fastjson.JSON;
import com.dao.UserDao;
import com.entity.MyReturn;
import com.entity.Userinfo;
import com.util.MySqlsessionFactory;
import com.util.MyTools;
import org.apache.ibatis.session.SqlSession;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@WebServlet(name = "UserServlet",urlPatterns = "/userinfo")
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取并连接mysql数据库
        SqlSession sqlSession= MySqlsessionFactory.getSQLSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 获取前端传来的method的值，根据其值来判断进行什么操作
        String method = request.getParameter("method");
        // 创建用户实体类 UserEntity
        Userinfo userinfo = new Userinfo();

        MyReturn myReturn = new MyReturn();
        // 设置一个默认为零的参数，后续用来保存 sql语句的影响条数
        int num = 0;
        // 通过switch 判断下一步进行的操作
        switch (method) {
            case "selectPageUser":
                // 获取前端传来的 当前页数：page
                int page = Integer.parseInt(request.getParameter("page"));
                // 获取前端传来的 每页条数：limit
                int limit = Integer.parseInt(request.getParameter("limit"));
                // start 用于分页，确定拼接limit查询时候的开始位置
                int start = (page - 1) * limit;
                // 把 分页 和 模糊查询的条件 传入实体/map
               /* userinfo.setStart(page);
                userinfo.setLimit(limit);
                userinfo.setUserid(Integer.parseInt(request.getParameter("userid")));
                userinfo.setUsername(request.getParameter("username"));*/
                Map<String,Object> map = new HashMap<>();
                map.put("start",start);
                map.put("limit",limit);
                map.put("userid",request.getParameter("userid"));
                map.put("username",request.getParameter("username"));
                map.put("field",request.getParameter("field"));
                map.put("order",request.getParameter("order"));
                // 通过list<Userinfo>获取查到的所有用户信息，每个用户是一个实体类，类似于之前的map
                List<Userinfo> userinfoList = userDao.selectPageUser(map);
                myReturn.setCode(0);
                myReturn.setMsg("");
                myReturn.setCount(userDao.getCount());
                myReturn.setData(userinfoList);
                break;
            case "addUser":
                // 获取前端传来的用户密码
                String password = request.getParameter("password");
                // 对用户密码进行加密，获得 密文 和 盐值：salt
                Map<String, String> passwordSalt = MyTools.makePasswordSalt(password);
                // 把用户信息封装为一个用户实体类
                userinfo.setUsername(request.getParameter("username"));
                userinfo.setPassword(passwordSalt.get("password"));
                userinfo.setSalt(passwordSalt.get("salt"));
                userinfo.setDeptid(Integer.parseInt(request.getParameter("deptid")));
                // 获取添加sql语句返回的影响条数
                num = userDao.addUser(userinfo);
                if (num > 0) {
                    myReturn.setCode(0);
                    myReturn.setMsg("添加成功");
                } else {
                    myReturn.setCode(200);
                    myReturn.setMsg("添加失败");
                }
                break;
            case "delUser":
                // 获取前端传来的用户id，ids.join(",")返回的是字符串，所以需要用string接收
                String useridStr = request.getParameter("userid");
                // 把获取到的字符串拆分为 userid数组，分割条件是  逗号
                String[] userids = useridStr.split(",");
                // 通过循环删除每一个 userid 对应的数据
                for (int i=0;i<userids.length;i++){
                    Integer userid = Integer.parseInt(userids[i]);
                    num = num + userDao.deleteUser(userid);
                }
                // 通过num累计 判断是否全部删除，通常情况不会删除失败
                // 当前方法不完善，等待补充
                if (num >= userids.length) {
                    myReturn.setCode(0);
                    myReturn.setMsg("删除成功");
                } else {
                    myReturn.setCode(200);
                    myReturn.setMsg("删除失败");
                }
                break;
            case "updateUser":
                /*// 把用户更改的密码重新加密，获得 新的密文 和 盐值
                Map<String,String> newMap = MyTools.makePasswordSalt(request.getParameter("password"));*/
                // 把用户更改后的信息 重新封装成用户实体
                userinfo.setUsername(request.getParameter("username"));
                userinfo.setPassword(request.getParameter("password"));
                userinfo.setSalt(request.getParameter("salt"));
                userinfo.setDeptid(Integer.parseInt(request.getParameter("deptid")));
                userinfo.setUserid(Integer.parseInt(request.getParameter("userid")));
                // 更改用户信息
                num = userDao.updateUser(userinfo);
                if (num > 0) {
                    myReturn.setCode(0);
                    myReturn.setMsg("修改成功");
                } else {
                    myReturn.setCode(200);
                    myReturn.setMsg("修改失败");
                }
                break;
            case "resetPwd":
                // 把用户更改的密码重新加密，获得 新的密文 和 盐值
                Map<String,String> passwordSaltMap = MyTools.makePasswordSalt(request.getParameter("password"));
                // 把用户更改后的密文（密码）和盐值 重新封装到当前用户的实体
                userinfo.setPassword(passwordSaltMap.get("password"));
                userinfo.setSalt(passwordSaltMap.get("salt"));
                userinfo.setUserid(Integer.parseInt(request.getParameter("userid")));
                // 更改用户信息
                num = userDao.resetPwd(userinfo);
                if (num > 0) {
                    myReturn.setCode(0);
                    myReturn.setMsg("修改成功");
                } else {
                    myReturn.setCode(200);
                    myReturn.setMsg("修改失败");
                }
                break;
        }
        // 将返回对象转为json对象
        String jsonStr = JSON.toJSONString(myReturn);
        response.getWriter().write(jsonStr);
        // 提交事务
        sqlSession.commit();
        // 关闭mysql连接
        sqlSession.close();
    }
}
